/**
 * 本地存储工具模块
 * 用于持久化保存用户数据，支持自动序列化和反序列化
 */

// 存储前缀，避免命名冲突
const PREFIX = 'hplus_'

/**
 * 设置存储项
 * @param {string} key - 存储键名
 * @param {any} value - 存储值（会自动序列化）
 */
const setItem = (key, value) => {
  try {
    const prefixedKey = PREFIX + key
    if (typeof value === 'object') {
      localStorage.setItem(prefixedKey, JSON.stringify(value))
    } else {
      localStorage.setItem(prefixedKey, value)
    }
    return true
  } catch (error) {
    console.error('存储数据失败:', error)
    return false
  }
}

/**
 * 获取存储项
 * @param {string} key - 存储键名
 * @param {any} defaultValue - 默认值，当获取失败时返回
 * @returns {any} 存储值（自动反序列化）
 */
const getItem = (key, defaultValue = null) => {
  try {
    const prefixedKey = PREFIX + key
    const value = localStorage.getItem(prefixedKey)
    
    if (value === null) {
      return defaultValue
    }
    
    // 尝试解析 JSON
    try {
      return JSON.parse(value)
    } catch (e) {
      // 如果解析失败，返回原始值
      return value
    }
  } catch (error) {
    console.error('获取数据失败:', error)
    return defaultValue
  }
}

/**
 * 移除存储项
 * @param {string} key - 存储键名
 */
const removeItem = (key) => {
  try {
    const prefixedKey = PREFIX + key
    localStorage.removeItem(prefixedKey)
    return true
  } catch (error) {
    console.error('移除数据失败:', error)
    return false
  }
}

/**
 * 清空所有存储项
 * 只清除当前应用相关的存储项（带前缀的）
 */
const clear = () => {
  try {
    // 获取所有键名
    const keys = []
    for (let i = 0; i < localStorage.length; i++) {
      const key = localStorage.key(i)
      if (key.startsWith(PREFIX)) {
        keys.push(key)
      }
    }
    
    // 移除匹配的键
    keys.forEach(key => localStorage.removeItem(key))
    
    return true
  } catch (error) {
    console.error('清空数据失败:', error)
    return false
  }
}

/**
 * 获取指定前缀的所有存储项
 * @param {string} prefix - 键名前缀
 * @returns {Object} 前缀匹配的键值对对象
 */
const getItemsByPrefix = (prefix) => {
  try {
    const result = {}
    const fullPrefix = PREFIX + prefix
    
    // 遍历所有键
    for (let i = 0; i < localStorage.length; i++) {
      const key = localStorage.key(i)
      if (key.startsWith(fullPrefix)) {
        // 移除存储前缀，只返回实际键名
        const realKey = key.substring(PREFIX.length)
        result[realKey] = getItem(realKey)
      }
    }
    
    return result
  } catch (error) {
    console.error('按前缀获取数据失败:', error)
    return {}
  }
}

/**
 * 检查存储是否可用
 * @returns {boolean} 存储是否可用
 */
const isAvailable = () => {
  try {
    const testKey = PREFIX + 'test'
    localStorage.setItem(testKey, 'test')
    const result = localStorage.getItem(testKey) === 'test'
    localStorage.removeItem(testKey)
    return result
  } catch (e) {
    return false
  }
}

export default {
  setItem,
  getItem,
  removeItem,
  clear,
  getItemsByPrefix,
  isAvailable
} 